Skip to content

!!!好了,现在请确定您的Shift-Lock(大小写锁定键)还没有按下,然后按键盘上的字母键 j 足够多次来移动光标,直到第一节的内容能够完全充满屏幕。

第一讲

字数
12020 字
阅读时间
48 分钟

第一节:移动光标

要移动光标,请依照说明分别按下 h、j、k、l 键

shell
   ^
   k
<h   l>	
   j
   v
HJKL:←↓↑→
h 的键位于左边,每次按下就会向左移动。
l 的键位于右边,每次按下就会向右移动。 
j 键看起来很象一支尖端方向朝下的箭头。
  1. 请随意在屏幕内移动光标,直至您觉得舒服为止。
  2. 按下下行键(j),直到出现光标重复下行。
  3. 现在请使用下行键,将光标移动到第一讲第二节。 提示:如果您不敢确定您所按下的字母,请按下<ESC>键回到正常(Normal)模式。 然后再次从键盘输入您想要的命令。

提示:光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够更快 地在屏幕内四处移动光标。真的是这样!

第二节:VIM的进入和退出

**!! 特别提示:**敬请阅读本一节的完整内容,然后再执行以下所讲解的命令。

  1. <ESC>键(这是为了确保您处在正常模式)。
  2. 然后输入: :q! <回车>,这种方式的退出编辑器会丢弃您进入编辑器以来所做的改动。
  3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是:vimtutor <回车>
  4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然后再次进入编辑器。 提示: :q! <回车> 会丢弃您所做的任何改动。几讲之后您将学会如何保存改动到文件。
  5. 将光标下移到第一讲第三节。

第三节:文本编辑之删除

在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。

  1. 请将光标移动到本节中下面标记有--->的那一行。
  2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。
  3. 然后按下 x 键将错误字符删除掉。
  4. 重复步骤2到步骤4,直到句子修正为止。
tex
---> The ccow jumpedd ovverr thhe mooon.
  1. 好了,该行已经修正了,下面是第一讲第四节。 特别提示:在浏览本教程时,不要强行记忆。记住一点:在使用中学习。

第四节:文本编辑之插入

在正常模式下,可以按下 i 键来插入文本。

  1. 请将光标移动到本节中下面标记有 ---> 的第一行。
  2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个准备插入字符 的位置。
  3. 然后按下 i 键,接着输入必要的文本字符。
  4. 每个错误修正完毕后,请按下 <ESC> 键返回正常模式。 重复步骤2至步骤4以便修正句子。
tex
---> There is text misng this.
---> There is some text missing from this line.
  1. 如果您对文本插入操作已经很满意,请接着阅读下面的第一讲第五节。

第五节:文本编辑之添加

按 A 键以添加文本

  1. 移动光标到下面第一个标记有 --->的一行。 光标放在那一行的哪个字符上并不重要。
  2. 按 A 键输入必要的添加内容。
  3. 文本添加完毕后,按 <ESC> 键回到正常模式。
  4. 移动光标到下面第二个标记有--->的一行。重复步骤2和步骤3以改正这个句子。
tex
---> There is some text missing from th
There is some text missing from this line.
---> There is also some text miss
There is also some text missing here.
  1. 当您对添加文本操作感到满意时,请继续学习第一讲第六节。

第六节:编辑文件

使用 :wq 以保存文件并退出。 特别提示:在执行以下步骤之前,请先读完整个小节!

  1. 如您在第一讲第二节中所做的那样退出本教程::q!。或者,如果您可以访问另一个终端,请在那里执行以下操作。
  2. 在 shell 的提示符下输入命令:vim tutor <回车>vim是启动Vim编辑器的命令,tutor是您希望编辑的文件的名字。请使用一个可以改动的文件。
  3. 使用您在前面的教程中学到的命令插入删除文本。
  4. 保存改动过的文件并退出 Vim,按这些键::wq <回车>
  5. 如果您在步骤1中已经退出 vimtutor,请重启 vimtutor 移动到下面的小结一节。
  6. 阅读完以上步骤,弄懂它们的意义,然后在实践中进行练习。

第一讲小结

  1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用hjkl字母键。 h (左移) j (下行) k (上行) l (右移)
  2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件名 <回车>
  3. 欲退出 Vim 编辑器,请输入 <ESC> :q! <回车> 放弃所有改动。或者输入 <ESC> :wq <回车> 保存改动。
  4. 在正常模式下删除光标所在位置的字符,请按: x
  5. 欲插入或添加文本,请输入:
tex
i 输入欲插入文本 `<ESC>` 在光标前插入文本
A 输入欲添加文本 `<ESC>` 在一行后添加文本

特别提示:按下 <ESC> 键会带您回到正常模式或者撤消一个不想输入或部分完整的命令。 好了,第一讲到此结束。下面接下来继续第二讲的内容。

第二讲

第一节:删除类命令

输入dw可以从光标处删除至一个单词的末尾。

  1. 请按下 <ESC> 键确保您处于正常模式。
  2. 请将光标移动到本节中下面标记有 ---> 的那一行。
  3. 请将光标移至准备要删除的单词的起始处。
  4. 接着输入 dw 删除掉该单词。 特别提示:当您输入时,字母 d 会同时出现在屏幕的最后一行。Vim 在等待您输入 字母 w。如果您看到的是除 d 外的其他字符,那表明您按错了;请按下 <ESC> 键, 然后重新再来。
tex
---> There are a some words fun that don't belong paper in this sentence.
  1. 重复步骤3和步骤4,直至句子修正完毕。接着继续第二讲第二节内容。

第二节:更多删除类命令

输入d$从当前光标删除到行末。

  1. 请按下 <ESC> 键确保您处于正常模式。
  2. 请将光标移动到本节中下面标记有--->的那一行。
  3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。
  4. 然后输入d$从光标处删至当前行尾部。
tex
---> Somebody typed the end of this line twice. end of this line twice.
  1. 请继续学习第二讲第三节就知道是怎么回事了。

第三节:关于命令和对象

许多改变文本的命令都由一个操作符和一个动作构成。 使用删除操作符 d 的删除命令的格式如下: d motion 其中: d - 删除操作符。 motion - 操作符的操作对象(在下面列出)。 一个简短的动作列表: w - 从当前光标当前位置直到下一个单词起始处,不包括它的第一个字符。 e - 从当前光标当前位置直到单词末尾,包括最后一个字符。 $ - 从当前光标当前位置直到当前行末。 因此输入de会从当前光标位置删除到单词末尾。

特别提示: 对于勇于探索者,请在正常模式下面仅按代表相应动作的键而不使用操作符,您 将看到光标的移动正如上面的对象列表所代表的一样。

第四节:使用计数指定动作

在动作前输入数字会使它重复那么多次。

  1. 移动光标到下面标记有 ---> 的一行的开始。
  2. 输入2w使光标向前移动两个单词。
  3. 输入3e使光标向前移动到第三个单词的末尾。
  4. 输入 0 (数字零) 移动光标到行首。
  5. 重复步骤2和步骤3,尝试不同的数字。
TEX
---> This is just a line with words you can move around in.
  1. 请继续学习第二讲第五节。

第五节:使用计数以删除更多

使用操作符时输入数字可以使它重复那么多次 上面已经提到过删除操作符和动作的组合,您可以在组合中动作之前插入一个数字以 删除更多: d number(数字) motion

  1. 移动光标到下面标记有--->的一行中第一个大写字母单词上。
  2. 输入 d2w 以删除两个大写字母单词。
  3. 重复步骤1和步骤2,使用不同的数字使得用一个命令就能删除全部相邻的大写字母单词
TEX
---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.

第六节:操作整行

输入dd可以删除整一个当前行 鉴于整行删除的高频度,Vi 的设计者决定要简化整行删除操作,您仅需要在同一行上 击打两次 d就可以删除掉光标所在的整行了。

  1. 请将光标移动到本节中下面的短句段落中的第二行。
  2. 输入 dd删除该行。
  3. 然后移动到第四行。
  4. 接着输入 2dd 删除两行。
tex
---> 1) Roses are red,
---> 2) Mud is fun,
---> 3) Violets are blue,
---> 4) I have a car,
---> 5) Clocks tell time,
---> 6) Sugar is sweet
---> 7) And so are you.

第七节:撤消类命令

输入 u 来撤消最后执行的命令,输入 U 来撤消对整行的修改。

  1. 请将光标移动到本节中下面标记有 ---> 的那一行,并将其置于第一个错误处。
  2. 输入 x 删除第一个不想保留的字母。
  3. 然后输入u撤消最后执行的(一次)命令。
  4. 这次要使用 x 修正本行的所有错误。
  5. 现在输入一个大写的 U ,恢复到该行的原始状态。
  6. 接着多次输入 u以撤消 U以及更前的命令。
  7. 然后多次输入CTRL-R (先按下 CTRL 键不放开,接着按 R 键),这样就可以重做被撤消的命令,也就是撤消掉撤消命令。
tex
---> Fiix the errors oon thhis line and reeplace them witth undo.
  1. 这些都是非常有用的命令。下面是第二讲的小结了。

第二讲小结

  1. 欲从当前光标删除至下一个单词,请输入:dw
  2. 欲从当前光标删除至当前行末尾,请输入:d$
  3. 欲删除整行,请输入:dd
  4. 欲重复一个动作,请在它前面加上一个数字:2w
  5. 在正常模式下修改命令的格式是: operator [number] motion 其中: operator - 操作符,代表要做的事情,比如 d 代表删除 [number] - 可以附加的数字,代表动作重复的次数 motion - 动作,代表在所操作的文本上的移动,例如 w 代表单词(word), $ 代表行末等等。
  6. 欲移动光标到行首,请按数字0键:0
  7. 欲撤消以前的操作,请输入:u (小写的u) 欲撤消在一行中所做的改动,请输入:U (大写的U) 欲撤消以前的撤消命令,恢复以前的操作结果,请输入:CTRL-R

第三讲

第一节:置入类命令

输入 p 将最后一次删除的内容置入光标之后

  1. 请将光标移动到本节中下面第一个标记有 ---> 的一行。
  2. 输入dd将该行删除,这样会将该行保存到 Vim 的一个寄存器中。
  3. 接着将光标移动到c)一行,即准备置入的位置的上方。记住:是上方哦。
  4. 然后在正常模式下(<ESC>键进入)输入 p 将该行粘贴置入。
  5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。
tex
---> d) Can you learn too?
---> b) Violets are blue,
---> c) Intelligence is learned,
---> a) Roses are red,

第二节:替换类命令

输入 r 和一个字符替换光标所在位置的字符

  1. 请将光标移动到本节中下面标记有 ---> 的第一行。
  2. 请移动光标到第一个出错的位置。
  3. 接着输入r和要替换成的字符,这样就能将错误替换掉了。
  4. 重复步骤2和步骤3,直到第一行已经修改完毕。
shell
---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!
  1. 然后我们继续学习第三讲第三节。 特别提示:切记您要在使用中学习,而不是在记忆中学习。

第三节:更改类命令

要改变文本直到一个单词的末尾,请输入ce

  1. 请将光标移动到本节中下面标记有--->的第一行。
  2. 接着把光标放在单词 lubw 的字母 u 的位置那里。
  3. 然后输入 cw 以及正确的单词(在本例中是输入ine)。
  4. 最后按 <ESC> 键,然后光标定位到下一个错误第一个准备更改的字母处。
  5. 重复步骤3和步骤4,直到第一个句子完全雷同第二个句子。
tex
---> This lubw has a few wptfd that mrrf changing usf the change operator.
---> This line has a few words that need changing using the change operator.

提示:请注意ce命令不仅仅是删除了一个单词,它也让您进入插入模式了。

第四节:使用c更改更多

更改类操作符可以与删除中使用的同样的动作配合使用

  1. 更改类操作符的工作方式跟删除类是一致的。操作格式是: c [number] motion
  2. 动作参数(motion)也是一样的,比如 w 代表单词,$代表行末等等。
  3. 请将光标移动到本节中下面标记有--->的第一行。
  4. 接着将光标移动到第一个错误处。
  5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按 <ESC> 键。
shell
---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.

第三讲小结

  1. 要重新置入已经删除的文本内容,请按小写字母 p 键。该操作可以将已删除的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置于当前光标所在行的下一行。
  2. 要替换光标所在位置的字符,请输入小写的 r和要替换掉原位置字符的新字符即可。
  3. 更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。比如输入 ce可以替换当前光标到单词的末尾的内容;输入c$可以替换当前光标到行末的内容。
  4. 更改类命令的格式是: ​ c [number] motion 现在我们继续学习下一讲。

第四讲

第一节:定位及文件状态

输入 CTRL-G 显示当前编辑文件中当前光标所在行位置以及文件状态信息。 输入大写 G 则直接跳转到文件中的某一指定行 提示:切记要先通读本节内容,之后才可以执行以下步骤!!!

  1. 按下CTRL键不放开然后按g 键。我们称这个键组合为 CTRL-G。您会看到页面最底部出现一个状态信息行,显示的内容是当前编辑的文件名和文件中光标位置。请记住行号,它会在步骤3中用到。 提示:您也许会在屏幕的右下角看到光标位置,这会在'ruler'选项设置时发生 (参见 :help 'ruler')
  2. 输入大写 G 可以使得当前光标直接跳转到文件最后一行。输入gg可以使得当前光标直接跳转到文件第一行。
  3. 输入您曾停留的行号,然后输入大写 G。这样就可以返回到您第一次按下CTRL-G 时所在的行了。
  4. 如果您觉得没问题的话,请执行步骤1步骤3的操作进行练习。

第二节:搜索类命令

输入 / 加上一个字符串可以用以在当前文件中查找该字符串

  1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底 部,这跟 : 命令是一样的。
  2. 接着输入 errroor <回车>。那个errroor就是您要查找的字符串。
  3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字 符串,请输入大写 N 即可。
  4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。
  5. 要回到您之前的位置按CTRL-O(按住Ctrl键不放同时按下字母 o)。重复按可以 回退更多步。CTRL-I 会跳转到较新的位置。
shell
---> "errroor" is not the way to spell error; errroor is an error.

提示:如果查找已经到达文件末尾,查找会自动从文件头部继续查找,除非'wrapscan' 选项被复位。

第三节:配对括号的查找

输入%可以查找配对的括号 )、]、}

  1. 把光标放在本节下面标记有 --> 那一行中的任何一个 (、[{ 处。
  2. 接着按%字符。
  3. 此时光标的位置应当是在配对的括号处。
  4. 再次按 % 就可以跳回配对的第一个括号处。
  5. 移动光标到另一个(、)、[、]、{ 或 }处,按 % 查看其所作所为。
shell
---> This ( is a test line with ('s, ['s ] and {'s } in it. ))

提示:在程序调试时,这个功能用来查找不配对的括号是很有用的。

第四节:替换命令

输入 :s/old/new/g可以替换 old 为 new。

  1. 请将光标移动到本节中下面标记有 ---> 的那一行。
  2. 输入 :s/thee/the <回车>。请注意该命令只改变光标所在行的第一个匹配串。
  3. 输入 :s/thee/the/g则是替换全行的匹配串,该行中所有的 "thee" 都会被 改变。
tex
---> thee best time to see thee flowers is in thee spring.
  1. 要替换两行之间出现的每个匹配串,请 输入 :#,#s/old/new/g其中 #,# 代表的是替换操作的若干行中首尾两行的行号。 输入 :%s/old/new/g则是替换整个文件中的每个匹配串。 输入 :%s/old/new/gc会找到整个文件中的每个匹配串,并且对每个匹配串提示是否进行替换。

第四讲小结

  1. CTRL-G用于显示当前光标所在位置和文件状态信息。 G 用于将光标跳转至文件最后一行。 先敲入一个行号然后输入大写G则是将光标移动至该行号代表的行。 gg 用于将光标跳转至文件第一行。
  2. 输入 / 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。 输入 ? 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。 完成一次查找之后按 n 键是重复上一次的命令,可在同一方向上查 找下一个匹配字符串所在;或者按大写 N 向相反方向查找下一匹配字符串所在。 CTRL-O带您跳转回较旧的位置,CTRL-I 则带您到较新的位置。
  3. 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。
  4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new 在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g 在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g 在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g 进行全文替换时询问用户确认每个替换需添加 c 标志 :%s/old/new/gc

第五讲

第一节:在 VIM 内执行外部命令的方法

输入:!然后紧接着输入一个外部命令可以执行该外部命令。

  1. 按下我们所熟悉的 : 命令使光标移动到屏幕底部。这样您就可以输入一行命令了。
  2. 接着输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。
  3. 我们以 ls 命令为例。输入 !ls <回车>。该命令就会列举出您当前目录的内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果!ls没起作用,您可以试试 :!dir看看。 提示:所有的外部命令都可以以这种方式执行,包括带命令行参数的那些。 提示:所有的 : 命令都必须以敲 <回车> 键结束。从今以后我们就不会总是提到这一点了。

第二节:关于保存文件的更多信息

要将对文件的改动保存到文件中,请输入 :w FILENAME 。

  1. 输入 :!dir或者:!ls获知当前目录的内容。您应当已知道最后还得敲<回车>吧。
  2. 选择一个未被用到的文件名,比如 TEST。
  3. 接着输入 :w TEST(此处 TEST 是您所选择的文件名。)
  4. 该命令会以 TEST 为文件名保存整个文件 (Vim 教程)。为了验证这一点,请再次输入:!dir:!ls查看您的目录列表内容。 请注意:如果您退出 Vim 然后在以命令 vim TEST 再次启动 Vim,那么该文件内 容应该同您保存时的文件内容是完全一样的。
  5. 现在您可以删除 TEST 文件了。在 MS-DOS 下,请输入::!del TEST 在 Unix 下,请输入::!rm TEST

第三节:一个具有选择性的保存命令

要保存文件的部分内容,请输入 v motion :w FILENAME

  1. 移动光标到本行。
  2. 接着按 v 键,将光标移动至下面第五个条目上(类似鼠标选中)。您会注意到之间的文本被高亮了。
  3. 然后按 : 字符。您将看到屏幕底部会出现:'<,'>
  4. 现在请输入 w TEST,其中 TEST 是一个未被使用的文件名。确认您看到了 :'<,'>w TEST之后按 <回车> 键。
  5. 这时Vim 会把选中的行写入到以 TEST 命名的文件中去。使用:!dir:!ls确认文件被正确保存。这次先别删除它!我们在下一讲中会用到它。 提示:按 v 键使 Vim 进入可视模式进行选取。您可以四处移动光标使选取区域变大或变小。接着您可以使用一个操作符对选中文本进行操作。例如,按 d 键会删除选中的文本内容。

第四节:提取和合并文件

要向当前文件中插入另外的文件的内容,请输入 :r FILENAME

  1. 请把光标移动到本行上面一行。 特别提示:执行步骤2之后您将看到第五讲第三节的文字,请届时往下移动以再次看到本讲内容。
  2. 接着通过命令:r TEST将前面创建的名为TEST的文件提取进来。您所提取进来的文件将从光标所在位置处开始置入。
  3. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第五讲第三节的内容,一份是原始内容,另外一份是来自文件的副本。 提示:您还可以读取外部命令的输出。例如, :r !ls可以读取 ls 命令的输出,并 把它放置在光标下面。

第五讲小结

  1. :!command 用于执行一个外部命令 command

请看一些实际例子: (MS-DOS) (Unix):!dir :!ls - 用于显示当前目录的内容。 :!del FILENAME :!rm FILENAME - 用于删除名为 FILENAME 的文件。

  1. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文 件中。

  2. v motion :w FILENAME 可将当前编辑文件中可视模式下选中的内容保存到文件 FILENAME 中。

  3. :r FILENAME可提取磁盘文件FILENAME并将其插入到当前文件的光标位置 后面。

  4. :r !dir可以读取dir命令的输出并将其放置到当前文件的光标位置后面。

第六讲

第一节:打开类命令

输入 o 将在光标的下方打开新的一行并进入插入模式。

  1. 请将光标移动到本节中下面标记有 ---> 的那一行。

  2. 接着输入小写的o在光标 下方 打开新的一行,这个命令会使您 进入插入模式。

  3. 然后输入一些文字,之后按 <ESC> 键退出插入模式而进入正常模式。

tex
---> After typing o the cursor is placed on the open line in Insert mode.
  1. 为了在光标 上方 打开新的一行,只需要输入大写的 O 而不是小写的 o 就可以了。请在下行测试一下吧。
tex
---> Open up a line above this by typing O while the cursor is on this line.

第二节:附加类命令

输入 a 将可在光标之后插入文本。

  1. 请在正常模式下将光标移动到本节中下面标记有 --->的第一行的行首。

  2. 接着输入 e 直到光标位于li的末尾。

  3. 输入小写的 a 则可在光标之后插入文本了。

  4. 将单词补充完整,就像下一行中的那样。之后按 <ESC> 键退出插入模式回到 正常模式。

  5. 使用 e 移动光标到下一步不完整的单词,重复步骤3和步骤4。

tex
---> This li will allow you to pract appendi text to a line.
---> This line will allow you to practice appending text to a line.

提示:a、i 和 A 都会带您进入插入模式,惟一的区别在于字符插入的位置。

第三节:另外一个置换类命令的版本

输入大写的 R 可连续替换多个字符。

  1. 请将光标移动到本节中下面标记有--->的第一行。移动光标到第一个xxx的 起始位置。

  2. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就 可以全部替换掉原有的字符而使得第一行完全雷同第二行了。

  3. 接着按 <ESC> 键退出替换模式回到正常模式。您可以注意到尚未替换的文本 仍然保持原状。

  4. 重复以上步骤,将剩余的 xxx 也替换掉。

tex
---> Adding 123 to xxx gives you xxx.
---> Adding 123 to 456 gives you 579.

提示:替换模式与插入模式相似,不过每个输入的字符都会删除一个已有的字符。

第四节:复制粘贴文本

使用操作符 y 复制文本,使用 p 粘贴文本

  1. 定位到下面标记有 ---> 的一行,将光标移动到 "a)" 之后。

  2. 接着使用 v 进入可视模式,移动光标到 "first" 的前面。

  3. 现在输入 y 以抽出(复制)高亮的文本。

  4. 然后移动光标到下一行的末尾:j$

  5. 接着输入p以放置(粘贴)复制了的文本。然后输入:a second <ESC>

  6. 使用可视模式选中 "item.",用 y 复制,再用 j$ 将光标移动到下一行末尾, 用 p 将文本粘贴到那里。

tex
---> a) this is the first item.
b)

提示:您还可以把 y 当作操作符来使用;例如 yw 可以用来复制一个单词。

第五节:设置类命令的选项

设置可使查找或者替换可忽略大小写的选项

  1. 要查找单词ignore可在正常模式下输入 /ignore <回车>。 要重复查找该词,可以重复按 n 键。

  2. 然后设置 ic 选项(Ignore Case,忽略大小写),请输入: :set ic

  3. 现在可以通过键入 n 键再次查找单词 ignore。注意到 Ignore 和 IGNORE 现在 也被找到了。

  4. 然后设置 hlsearchincsearch 这两个选项,请输入: :set hls is

  5. 现在可以再次输入查找命令,看看会有什么效果: /ignore <回车>

  6. 要禁用忽略大小写,请输入: :set noic

提示:要移除匹配项的高亮显示,请输入: :nohlsearch 提示:如果您想要仅在一次查找时忽略字母大小写,您可以使用 \c: /ignore\c <回车>

第六讲小结

  1. 输入小写的o可以在光标下方打开新的一行并进入插入模式。 输入大写的 O 可以在光标上方打开新的一行。

  2. 输入小写的 a 可以在光标所在位置之后插入文本。 输入大写的 A 可以在光标所在行的行末之后插入文本。

  3. e 命令可以使光标移动到单词末尾。

  4. 操作符 y 复制文本,p 粘贴先前复制的文本。

  5. 输入大写的 R 将进入替换模式,直至按 <ESC> 键回到正常模式。

  6. 输入 :set xxx可以设置 xxx 选项。一些有用的选项如下: 'ic' 'ignorecase'查找时忽略字母大小写 'is' 'incsearch'查找短语时显示部分匹配 'hls' 'hlsearch'高亮显示所有的匹配短语 选项名可以用完整版本,也可以用缩略版本。

  7. 在选项前加上 no 可以关闭选项: :set noic

第七讲

第一节:获取帮助信息

使用在线帮助系统

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方 法之一:

  • 按下 <HELP> 键 (如果键盘上有的话)
  • 按下 <F1> 键 (如果键盘上有的话)
  • 输入 :help <回车>

请阅读帮助窗口中的文字以了解帮助是如何工作的。 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。 输入:q <回车>可以关闭帮助窗口。

提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以 下参数(可别忘了按回车键哦):

shell
:help w
:help c_CTRL-D
:help insert-index
:help user-manual

第二节:创建启动脚本

启用 Vim 的特性Vim 的功能特性要比Vi多得多,但其中大部分都没有缺省启用。为了使用更多的 特性,您得创建一个 vimrc 文件。

  1. 开始编辑 vimrc 文件,具体命令取决于您所使用的操作系统: :edit ~/.vimrc这是 Unix 系统所使用的命令 :edit $VIM/_vimrc这是 MS-Windows 系统所使用的命令
  2. 接着读取 vimrc 示例文件的内容: :r $VIMRUNTIME/vimrc_example.vim
  3. 保存文件,命令为: :write 下次您启动 Vim 时,编辑器就会有了语法高亮的功能。 您可以把您喜欢的各种设置添加到这个 vimrc 文件中。 要了解更多信息请输入 :help vimrc-intro

第三节:补全功能

使用CTRL-D和 <TAB> 可以进行命令行补全

  1. 请确保 Vim 不是在以兼容模式运行: :set nocp
  2. 查看一下当前目录下已经存在哪些文件,输入::!ls或者 :!dir
  3. 现在输入一个目录的起始部分,例如输入: :e
  4. 接着按 CTRL-D 键,Vim 会显示以 e开始的命令的列表。
  5. 然后按<TAB> 键,Vim 会补全命令为 :edit
  6. 现在添加一个空格,以及一个已有文件的文件名的起始部分,例如::edit FIL
  7. 接着按 <TAB> 键,Vim 会补全文件名(如果它是惟一匹配的)。 提示:补全对于许多命令都有效。您只需尝试按 CTRL-D<TAB>。 它对于 :help命令非常有用。

第七讲小结

  1. 输入:help或者按 <F1> 键或 <Help> 键可以打开帮助窗口。
  2. 输入 :help cmd可以找到关于 cmd 命令的帮助。
  3. 输入CTRL-W CTRL-W可以使您在窗口之间跳转。
  4. 输入 :q 以关闭帮助窗口
  5. 您可以创建一个 vimrc 启动脚本文件用来保存您偏好的设置。
  6. 当输入 : 命令时,按 CTRL-D 可以查看可能的补全结果。 按 <TAB> 可以使用一个补全。

VIM 进阶

以上使用VIM只能让你简单的进行修改部分文字,但还无法可以让你修改代码的程度。现在开始学习更加复杂的用法。

vimrc

==空!!!!==

插件

插件管理有:

  • vim-plug
  • Vundle
  • dein.vim
  • Volt

这里使用的插件管理是vim-plug。 插件网站:

  1. Vim Awesome 插件网站

安装

shell
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

Youcompleteme(YCM-自动补全)

该插件是用来自动补全代码的。

安装

shell
# 在~/.vim/plugged/下执行
git clone --recursive https://github.com/ycm-core/YouCompleteMe.git
shell
# 在上面clone的YCM工程目录下执行
git submodule update --init --recursive
shell
# 在该目录下执行
python ./install.py --clang-completer #注意“--clang-completer”不能丢弃,否者无法自动补全C语言,因为YCM依赖clang

参考链接:

https://blog.csdn.net/m0_73825482/article/details/136078479

添加第三方头文件或自己的头文件

  • 配置~/.vimrc,注意不需要全部设置,看需要设置。
shell

" 设置默认的配置文件,可以按照上文攥写的位置来修改,笔者修改了位置 "
let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
"打开vim时不再询问是否加载ycm_extra_conf.py配置"
let g:ycm_confirm_extra_conf=0
"是否开启语义补全"
let g:ycm_seed_identifiers_with_syntax=1
"是否在注释中也开启补全"
let g:ycm_complete_in_comments=1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
"开始补全的字符数"
let g:ycm_min_num_of_chars_for_completion=2
"补全后自动关机预览窗口"
let g:ycm_autoclose_preview_window_after_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项"
let g:ycm_cache_omnifunc=0
"字符串中也开启补全"
let g:ycm_complete_in_strings = 1
"离开插入模式后自动关闭预览窗口"
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
"回车即选中当前项"
inoremap <expr> <CR>       pumvisible() ? '<C-y>' : '\<CR>'     
"上下左右键行为"
inoremap <expr> <Down>     pumvisible() ? '\<C-n>' : '\<Down>'
inoremap <expr> <Up>       pumvisible() ? '\<C-p>' : '\<Up>'
inoremap <expr> <PageDown> pumvisible() ? '\<PageDown>\<C-p>\<C-n>' : '\<PageDown>'
inoremap <expr> <PageUp>   pumvisible() ? '\<PageUp>\<C-p>\<C-n>' : '\<PageUp>'

全部的中文解释如下(==仅仅作为参考,不需要设置==):

shell
" YouCompleteMe
" Python Semantic Completion
let g:ycm_python_binary_path = '/usr/bin/python3'
" C family Completion Path
let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
" 跳转快捷键
nnoremap <c-k> :YcmCompleter GoToDeclaration<CR>|
nnoremap <c-h> :YcmCompleter GoToDefinition<CR>| 
nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR>|
" 停止提示是否载入本地ycm_extra_conf文件
let g:ycm_confirm_extra_conf = 0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax = 1
" 开启 YCM 基于标签引擎
let g:ycm_collect_identifiers_from_tags_files = 1
" 从第2个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=2
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
" 注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1
" 弹出列表时选择第1项的快捷键(默认为<TAB>和<Down>)
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
" 弹出列表时选择前1项的快捷键(默认为<S-TAB>和<UP>)
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
" 主动补全, 默认为<C-Space>
"let g:ycm_key_invoke_completion = ['<C-Space>']
" 停止显示补全列表(防止列表影响视野), 可以按<C-Space>重新弹出
"let g:ycm_key_list_stop_completion = ['<C-y>']
  • 添加规则文件 规则文件是:.ycm_extra_conf.py它可以从YCM插件目录下使用find命令获取,有多种配置模板,根据需要复制到~目录下,这里使用的是:~/.vim/plugged/YouCompleteMe。 规则文件还可以复制到项目/工程目录下,这也是可以生效的,~/.ycm_extra_conf.py是全局生效的,而工程或者第三方头文件下的.ycm_extra_conf.py是局部的,可以使得打开vim更快。 添加格式如下:
shell
# vim .ycm_extra_conf.py
# 找到:
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall',
'-Wextra',
# '-Werror',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-DNDEBUG',
# You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
# source code needs it.
'-DUSE_CLANG_COMPLETER',
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when
......
# 添加自己的头文件
"-I",
"~/Project/include",
# 也可以
"-isystem",
"~/Project2/include",
]

这里的-I-isystem实际上是来自于gcc,详细情况可以查看gcc文档。

  • 再次打开自己写的*.c文件后,输入代码,即可实现自动补全:

NERDTree

NERDTree的作用就是列出当前路径的目录树,一般IDE都是有的。可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名。

安装

比较简单

使用

  • 配置
shell
" NERDTree config
 map <F2> :NERDTreeToggle<CR>
 autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endif

第一条是说使用F2键快速调出和隐藏它; 第二条是关闭vim时,如果打开的文件除了NERDTree没有其他文件时,它自动关闭,减少多次按:q!。 如果想打开vim时自动打开NERDTree,可以如下设定

shell
autocmd vimenter * NERDTree
  • 快捷键
shell
ctrl + w + h    光标 focus 左侧树形目录
ctrl + w + l    光标 focus 右侧文件显示窗口
ctrl + w + w    光标自动在左右侧窗口切换 #!!!
ctrl + w + r    移动当前窗口的布局位置
shell
o       在已有窗口中打开文件、目录或书签,并跳到该窗口
go      在已有窗口 中打开文件、目录或书签,但不跳到该窗口
t       在新 Tab 中打开选中文件/书签,并跳到新 Tab
T       在新 Tab 中打开选中文件/书签,但不跳到新 Tab
i       split 一个新窗口打开选中文件,并跳到该窗口
gi      split 一个新窗口打开选中文件,但不跳到该窗口
s       vsplit 一个新窗口打开选中文件,并跳到该窗口
gs      vsplit 一个新 窗口打开选中文件,但不跳到该窗口
!       执行当前文件
O       递归打开选中 结点下的所有目录
x       合拢选中结点的父目录
X       递归 合拢选中结点下的所有目录
e       Edit the current dif
 
双击    相当于 NERDTree-o
中键    对文件相当于 NERDTree-i,对目录相当于 NERDTree-e
 
D       删除当前书签
 
P       跳到根结点
p       跳到父结点
K       跳到当前目录下同级的第一个结点
J       跳到当前目录下同级的最后一个结点
k       跳到当前目录下同级的前一个结点
j       跳到当前目录下同级的后一个结点
 
C       将选中目录或选中文件的父目录设为根结点
u       将当前根结点的父目录设为根目录,并变成合拢原根结点
U       将当前根结点的父目录设为根目录,但保持展开原根结点
r       递归刷新选中目录
R       递归刷新根结点
m       显示文件系统菜单 #!!!然后根据提示进行文件的操作如新建,重命名等
cd CWD 设为选中目录
 
I       切换是否显示隐藏文件
f       切换是否使用文件过滤器
F       切换是否显示文件
B       切换是否显示书签
 
q       关闭 NerdTree 窗口
?       切换是否显示 Quick Hel
shell
:tabnew [++opt选项] [+cmd] 文件      建立对指定文件新的tab
:tabc   关闭当前的 tab
:tabo   关闭所有其他的 tab
:tabs   查看所有打开的 tab
:tabp   前一个 tab
:tabn   后一个 tab
 
标准模式下:
gT      前一个 tab
gt      后一个 tab
 
MacVim 还可以借助快捷键来完成 tab 的关闭、切换
cmd+w   关闭当前的 tab
cmd+{   前一个 tab
cmd+}   后一个 tab

tagbar

tagbar是一个taglist的替代品,比taglist更适合c++使用,函数能够按类区分,支持按类折叠显示等,显示结果清晰简洁.

tagbar插件可以把源代码文件生成一个大纲,包括类,方法,变量以及函数名等,可以选中并快速跳转到目标位置。ctags,taglist只能够对函数,结构体,宏进行标记,但是对类的支持不够全面,不能够查看类有什么函数以及成员变量和公私属性,而tagbar可以很好地解决这个问题。

VIM操作

搜索

  • /向前搜索?向后搜索。
  • 按下 Enter 键,Vim会跳转到第一个匹配的文本。
  • 如果要查找下一个匹配项,可以按下 n 键(下一个)。
  • 如果要查找上一个匹配项,可以按下 N 键(上一个)。
  • 你可以在搜索文本后面加上 /? 后跟一些选项:
    • g:如 /example/g ,在每一行中查找所有匹配项。
    • i:如?example/i,不区分大小写搜索。

替换

复制

  • 复制整个函数
shell
V + ] (两次) 	   #即可选中函数
y复制,p粘贴 	#接着使用这些命令来操作
  • 删除整个函数内容
shell
c+i+{
  • 快速自定义行选中
shell

切换视图/窗格

Ctrl+i上一次修改的地方

Ctrl+o后面修改的地方

shell
:e file     # 在当前 vim 中再打开一个文件,此时vim里会显示出file文件的内容。
:sp         # 水平切分窗口
:vsplit     # 垂直切分窗口
shell
# 文件间切换
Ctrl+6  //两文件间的切换
:ls		//查看所有打开的文件,会有一个序号,给下面b命令使用
:bn      //下一个文件
:bp      //上一个文件
:ls       //列出打开的文件,带编号
:b1~n  //切换至第n个文件
:bd		//关闭当前文件
shell
# 窗格间切换
Ctrl + w + 方向键    	  # 切换到前/下/上/后一个窗格
Ctrl + w + h/j/k/l  	# 同上
Ctrl + ww           	# 依次向后切换到下一个窗格中
ctrl+w t 			#移动到顶端
ctrl+w b 			#移动到底端
shell
# 窗格大小调整
1、纵向调整
:resize +n 			将当前窗口高度增加n行  等同于"ctrl+w +",就是同时按住ctrl和w键后再按+键
:resize -n 			将当前窗口高度减少n行  等同于"ctrl+w -"
:res[ize]  num		指定当前窗口为num列num行
:res[ize] +num		把当前窗口高度增加num行
:res[ize] -num		把当前窗口高度减少num行

2、横向调整
:vertical resize ±n 			将当前窗口宽度增加或减少n列
等同于ctrl+w < or >
:vert[ical] res[ize]  num		指定当前窗口为num列
:vert[ical] res[ize] +num		把当前窗口增加num列
:vert[ical] res[ize] -num		把当前窗口减少num列

所以可以增加映射来调整窗口大小,例如使用shift+上下左右键分别来调整窗口大小,具体如下:
nnoremap <S-Up> :resize -1<CR>
nnoremap <S-Down> :resize +1<CR>
nnoremap <S-Left> :vertical resize -1<CR>
nnoremap <S-Right> :vertical resize +1<CR>
shell
# 窗口交换
Ctrl + w + r		#向右或向下方交换窗口			
Ctrl + w + R		#和上面方向相反。
Ctrl + w + x		#交换同列或同行的窗口的位置。vim默认交换当前窗口的与它下一个窗口的位置,如果下方没有窗口,则试着与上一个窗口交换位置。亦可在此命令前加上数量,与制定的窗口交换位置。

贡献者

The avatar of contributor named as Px Px

页面历史

撰写